"""
进程池：进程池复用进程，节省开销
    阻塞式：

    非阻塞式：全部添加到队列中，立刻返回，并没有等待其它进程执行完毕之后，但是回调函数是等待任务执行完后才会调用的
"""
from multiprocessing import Pool
import time
import os

# 非阻塞式
from random import random


def task(name):
    print("开始做任务", name)
    start = time.time()
    time.sleep(random() * 2)
    end = time.time()
    print("完成任务时间，用时,", (end - start), "pid", os.getpid())
    return name  # 返回值会传递给回调函数里面


container = []


# 回调函数
def callback_func(name):
    container.append(name)


if __name__ == "__main__":
    pool = Pool(5)
    tasks = ['task1', 'task2', 'task3', 'task4', 'task5', 'task6']
    for i in tasks:
        pool.apply_async(task, args=(i,), callback=callback_func)  # 非阻塞，一共6个任务，首先只有5个任务被执行，剩下的一个会等待
    pool.close()  # 添加任务结束
    pool.join()  # 等待子进程执行完毕

    print(container)
    print("finish----------")
